import router from '@/router'
import store from '@/store'
import asyncRouters from '@/router/asyncRouters'
const whiteList = ['/login', '/404']
// 获取一级权限的标识
function getFirstRouterPermission(permision) {
  const firstSplit = permision.map(ele => {
    return ele.split(':')[0] // 利用map分割冒号取第一项就是第一个权限
  })
  // 去除重复的第一项 new Set() 不能存重复的数据
  // new Set() 去重后是一个伪数组 需转换为真数组Array.from()
  return Array.from(new Set(firstSplit))
}
// 获取二级权限的标识
function getSecondRouterPermission(permision) {
  const secondSplit = permision.map(ele => {
    const arr = ele.split(':')
    return `${arr[0]}:${arr[1]}`
  })
  return Array.from(new Set(secondSplit))
}
// 根据一级和二级权限标识 筛选出对应可展示的动态路由
function getRoutes(firstPermission, secondPermission, asyncRouters) {
  // 判断当前登陆人是不是管理员 如果是管理页就不筛选
  if (firstPermission.includes('*')) {
    return asyncRouters
  }
  const firstRoutes = asyncRouters.filter(item => firstPermission.includes(item.permission))
  // 筛选二级下面的children
  const routes = firstRoutes.map(ele => {
    return {
      ...ele,
      children: ele.children.filter(child => secondPermission.includes(child.permission))
    }
  })
  return routes
}
router.beforeEach(async(to, from, next) => {
  // to 跳转的路由对象
  // from 从哪里来
  // next 放行 next() 重定向 next(路径)
  const token = store.state.user.token
  if (token) {
    // 有token
    if (to.path === '/login') {
      next('/') // 二次访问登陆 跳转主页
    } else {
      next()
      // 1.拿到用户的权限信息
      const permision = await store.dispatch('menu/getUserPermission')
      console.log('全部的权限标识', permision)
      // 2.根据权限标识 筛选出对应的一级路由标识
      const firstPermission = getFirstRouterPermission(permision)
      console.log('一级权限标识', firstPermission)
      // 3.根据权限标识 筛选出对应的二级路由标识
      const secondPermission = getSecondRouterPermission(permision)
      console.log('二级权限标识', secondPermission)
      // 4.根据一级权限和二级权限以及动态路由尽显筛选
      const routes = getRoutes(firstPermission, secondPermission, asyncRouters)
      console.log(routes)
      // 5.把筛选后的路由 展示在左侧 router.addRoute(添加的路由)
      // 5.1把筛选后的路由添加到 路由对象中（跳转）
      routes.forEach(ele => router.addRoute(ele))
      // 5.2再把筛选后的路由添加到vuex中
      store.commit('menu/setMenuList', routes)
    }
  } else {
    // 无token
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
    }
  }
})
